package processes

import (
	"chatroom/common/message"
	"chatroom/server/utils"
	"encoding/json"
	"fmt"
	"net"
)

type SmsProcess struct {
	//..暂时不需要字段
}

//写方法转发私聊信息
func (smsProcess *SmsProcess) SendPrivateMes(mes *message.Message) {
	//取出 mes.Data 信息内容，放在 privateMes 中
	var privateMes message.PrivateMes
	err := json.Unmarshal([]byte(mes.Data), &privateMes)
	if err != nil {
		fmt.Println("SendPrivateMes json.Unmarshal([]byte(mes.Data),&privateMes) err=", err)
		return
	}

	//将格式从 SmsMesType 转换为 SmsResMesType，传递回客户端的格式
	mes.Type = message.PrivateResMesType

	//创建 PrivateResMes 实例，返回私聊信息给客户端
	var privateResMes message.PrivateResMes
	privateResMes.Content = privateMes.Content
	privateResMes.UserId = privateMes.UserId
	privateResMes.UserName = privateMes.UserName

	//序列化 privateResMes
	data, err := json.Marshal(privateResMes)
	if err != nil {
		fmt.Println("SendPrivateMes json.Marshal(privateResMes) err=", err)
		return
	}
	//将值传入 mes 中
	mes.Data = string(data)
	//序列化 mes，准备发往客户端
	data, err = json.Marshal(mes)
	if err != nil {
		fmt.Println("SendPrivateMes json.Marshal(mes) err=", err)
		return
	}

	//发送到对应的id的客户端
	for id, up := range userMgr.onlineUsers { 
		if id == privateMes.ReceiveId { //如果是这个接收者的id
			smsProcess.SendMesToOnlineUser(data, up.Conn)
			privateMes.ReceiveId = 0 //用来判断是否存在这个 id
			break
		}
	}

	if privateMes.ReceiveId != 0 {
		fmt.Println("用户 id 出错，发送失败...")
		return
	}
}

//写方法转发群消息
func (smsProcess *SmsProcess) SendGroupMes(mes *message.Message) {

	//遍历服务器端的 onlineUsers map[int]*UserProcess
	//将消息转发出去

	//取出 mes 的内容,放在SmsResMes 中，返回至客户端中
	var smsResMes message.SmsResMes
	err := json.Unmarshal([]byte(mes.Data), &smsResMes)
	if err != nil {
		fmt.Println("SendGroupMes json.Unmarshal([]byte(mes Data),&smsMes) err=", err)
		return
	}

	//将格式从 SmsMesType 转换为 SmsResMesType，传递回客户端的格式
	mes.Type = message.SmsResMesType

	//将mes 序列化，传给客户端
	data, err := json.Marshal(mes)
	if err != nil {
		fmt.Println("SendGroupMes json.Marshal(mes) err=", err)
		return
	}

	for id, up := range userMgr.onlineUsers {

		//此处的id 是传输过来的 发送人 的id,
		if id == smsResMes.UserId { //过滤掉发送者，不要发送给发送者
			continue
		}
		smsProcess.SendMesToOnlineUser(data, up.Conn)
	}
}

//
func (smsProcess *SmsProcess) SendMesToOnlineUser(data []byte, conn net.Conn) {

	//创建一个 TransFer 实例，发送data
	tf := &utils.TransFer{
		Conn: conn,
	}
	err := tf.WritePkg(data)
	if err != nil {
		fmt.Println("SendMesToEachOnlineUser  tf.WriterPkg(data) err=", err)
	}
}
